
std::vector<DNNRuntimeAPI> DNNRuntimeAPISpecs = {
  // CUBLAS
  DNNRuntimeAPI(API::CUBLAS_MATMUL_2D, "CUBLASMatmul2dFunc", floatPtrTy,
    {int64Ty,
    floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy,
    floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy,
    floatTy, floatTy, int64Ty, int64Ty}),
    
  // CUDA Custom kernels
  DNNRuntimeAPI(API::CUDA_CAST, "CUDACastI64toFloatFunc", floatPtrTy,
    {int64PtrTy, floatPtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_CLIP, "CUDAClipFunc", floatPtrTy,
    {floatPtrTy, floatPtrTy, int64PtrTy, floatTy, floatTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_CONCAT_I64, "CUDAConcatInt64Func", int64PtrTy,
    {int64PtrPtrTy, int64PtrPtrTy, int64PtrTy, int64PtrTy, int64Ty, int64Ty, int32Ty}),
  DNNRuntimeAPI(API::CUDA_CONCAT_F32, "CUDAConcatFloatFunc", floatPtrTy,
    {floatPtrPtrTy, int64PtrPtrTy, floatPtrTy, int64PtrTy, int64Ty, int64Ty, int32Ty}),
  DNNRuntimeAPI(API::DNN_DEALLOC, "wrapDNNDealloc", int32Ty, {int8PtrTy}),
  DNNRuntimeAPI(API::CUDA_GATHER_I64, "CUDAGatherInt64Func", int64PtrTy,
    {int64PtrTy, int64PtrTy, int64Ty,
    int64PtrTy, int64PtrTy, int64Ty,
    int64PtrTy, int64PtrTy, int64Ty,
    int64Ty}),
  DNNRuntimeAPI(API::CUDA_GATHER_F32, "CUDAGatherFloatFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, int64Ty,
    floatPtrTy, int64PtrTy, int64Ty,
    int64PtrTy, int64PtrTy, int64Ty,
    int64Ty}),
  DNNRuntimeAPI(API::CUDA_ERF, "CUDAErfFunc", floatPtrTy,
    {floatPtrTy, floatPtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_EXPAND, "CUDAExpandInt64Func", int64PtrTy,
    {int64PtrTy, int64PtrTy, int64Ty,
    int64PtrTy, int64PtrTy,
    int64PtrTy, int64PtrTy}),
  DNNRuntimeAPI(API::CUDA_FLATTEN, "CUDAFlattenFunc",
    floatPtrTy, {floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy, int32Ty, int64Ty}),
  DNNRuntimeAPI(API::CUDA_LEAKYRELU, "CUDALeakyReluFunc", floatPtrTy,
    {floatPtrTy, floatPtrTy, int64PtrTy, floatTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_MALLOC, "wrapDNNMalloc", int32Ty, {int8PtrPtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_MATMUL_ND, "CUDAMatmulNdFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, int32Ty,
    floatPtrTy, int64PtrTy, int32Ty,
    floatPtrTy, int64PtrTy, int32Ty}),
  DNNRuntimeAPI(API::CUDA_MEMCPY, "wrapDNNMemcpy", int32Ty,
    {int8PtrTy, int8PtrTy, int64Ty, int32Ty, streamPtrTy}),
  DNNRuntimeAPI(API::CUDA_MEMOFFSET, "wrapDNNMemOffset", int32Ty,
    {int8PtrPtrTy, int8PtrTy, int64Ty, int64Ty}),
  DNNRuntimeAPI(API::CUDA_MEMPOOLINIT, "wrapDNNMemPoolInit", int32Ty, {int8PtrPtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_NEGATIVE, "CUDANegativeFunc", floatPtrTy,
    {floatPtrTy, floatPtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_NONZERO_I64, "CUDANonZeroInt64Func", int64PtrTy,
    {int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_NONZERO_F32, "CUDANonZeroFloatFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_POW, "CUDAPowFunc", floatPtrTy,
    {floatPtrTy, floatPtrTy, floatPtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_PRELU, "CUDAPReluFunc", floatPtrTy,
    {floatPtrTy, floatPtrTy, int64PtrTy, floatPtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_RECIPROCAL, "CUDAReciprocalFunc", floatPtrTy,
    {floatPtrTy, floatPtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_RESHAPE, "CUDAReshapeFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, int64Ty, floatPtrTy}),
  DNNRuntimeAPI(API::CSRC_SOFTMAX, "CUDASoftmaxFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy, int64Ty, int64Ty}),
  DNNRuntimeAPI(API::CUDA_SQUEEZE_I64, "CUDASqueezeInt64Func",
    int64PtrTy, {int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_SQUEEZE_F32, "CUDASqueezeFloatFunc",
    floatPtrTy, {floatPtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_TRANSPOSE_2D_I64, "CUDATranspose2DInt64Func", int64PtrTy,
    {int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_TRANSPOSE_2D_F32, "CUDATranspose2DFloatFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_TRANSPOSE_3D_I64, "CUDATranspose3DInt64Func", int64PtrTy,
    {int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_TRANSPOSE_3D_F32, "CUDATranspose3DFloatFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_TRANSPOSE_4D_I64, "CUDATranspose4DInt64Func", int64PtrTy,
    {int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_TRANSPOSE_4D_F32, "CUDATranspose4DFloatFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_TRANSPOSE_6D_I64, "CUDATranspose6DInt64Func", int64PtrTy,
    {int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_TRANSPOSE_6D_F32, "CUDATranspose6DFloatFunc", floatPtrTy,
    {floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_UNSQUEEZE_I64, "CUDAUnsqueezeInt64Func",
    int64PtrTy, {int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),
  DNNRuntimeAPI(API::CUDA_UNSQUEEZE_F32, "CUDAUnsqueezeFloatFunc",
    floatPtrTy, {floatPtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64PtrTy, int64Ty}),

  // DNN utilizing kernels
  DNNRuntimeAPI(API::CUDNN_CREATE, "cudnnCreate", int32Ty, {handlePtrAddrTy}),
  DNNRuntimeAPI(API::CUDNN_DESTROY, "cudnnDestroy", int32Ty, {handlePtrTy}),
  DNNRuntimeAPI(API::STREAM_CREATE, "cudaStreamCreate", int32Ty, {streamPtrAddrTy}),
  DNNRuntimeAPI(API::STREAM_DESTROY, "cudaStreamDestroy", int32Ty, {streamPtrTy}),

  DNNRuntimeAPI(API::CSRC_ACTIVEFWD, "DNNActiveFunc",
    floatPtrTy, {handlePtrTy, floatPtrTy, int64PtrTy, int32Ty, floatPtrTy}),
  DNNRuntimeAPI(API::CSRC_TENSOR_OP, "DNNTensorOpFunc", floatPtrTy,
    {handlePtrTy, int64Ty,
    floatPtrTy, int64PtrTy, int32Ty,
    floatPtrTy, int64PtrTy, int32Ty,
    floatPtrTy, int64PtrTy, int32Ty,
    floatTy}),
  DNNRuntimeAPI(API::CSRC_AVERAGEPOOL, "DNNAveragePoolFunc",
    floatPtrTy, {handlePtrTy, floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy,
    int64PtrTy, int64PtrTy, int64PtrTy}),
  DNNRuntimeAPI(API::CSRC_CONVFWD, "DNNConvFunc", floatPtrTy,
    {handlePtrTy, floatPtrTy, int64PtrTy,
    floatPtrTy, int64PtrTy,
    floatPtrTy, int64Ty, int64Ty, int64Ty,
    int64PtrTy, int64PtrTy, floatPtrTy}),
  DNNRuntimeAPI(API::CSRC_MAXPOOL, "DNNMaxPoolFunc",
    floatPtrTy, {handlePtrTy, floatPtrTy, int64PtrTy, floatPtrTy, int64PtrTy,
    int64PtrTy, int64PtrTy, int64PtrTy}),
  DNNRuntimeAPI(API::CSRC_REDUCE, "DNNReduceFunc",
    floatPtrTy, {handlePtrTy, int32Ty,
    floatPtrTy, int64PtrTy,
    floatPtrTy, int64PtrTy, int32Ty}),

  DNNRuntimeAPI(API::CSRC_CONV_BIAS_RELUFWD, "DNNConvBiasActivFunc", floatPtrTy,
    {handlePtrTy, floatPtrTy, int64PtrTy,
    floatPtrTy, int64PtrTy,
    floatPtrTy, int64PtrTy,
    floatPtrTy, int64Ty, int64Ty,
    int64PtrTy, int64PtrTy,
    int64Ty, floatPtrTy}),

};

